package com.study.packet;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @ClassName: MessageDecode
 * @Description:
 * @Date 2024/04/29 17:22
 * @Author songshaoqiu
 **/
public class MessageDecode extends ByteToMessageDecoder {

     static int length = 0;
    /**
     *
     * @param channelHandlerContext
     * @param in 客户端发送来的MessageProtocol 编码后的byteBuf数据
     * @param out
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
        System.out.println("ByteBuf:"+in);
        //获取前面4个字节的数据== 描述实际内容的长度
        if (in.readableBytes()>=4){
            //ByteBuf里面可能有MessageProtocol
            if (length==0){
                length = in.readInt();
            }
            if (in.readableBytes()<length){
                //说明数据还没到齐，等待下一次调用decode
                System.out.println("当前数据录不够，继续等待");
                return;
            }
            //可读取数据录>=length ==> 意味着 这一次的MessageProtocol中的内容以及到齐了
            //创建一个指定length长度的字节数组
            byte[] bytes = new byte[length];
            //把ByteBuf里的指定长度的数据督导content数组中
            in.readBytes(bytes);
            //创建MessageProtocol对象 并赋值
            MessageProtocol messageProtocol = new MessageProtocol();
            messageProtocol.setLength(length);
            messageProtocol.setContent(bytes);

            //传递给下一个handler
            out.add(messageProtocol);
            length = 0;

        }

    }
}
